让我们一起,一探究竟,了解一下MongoDB的特点和基本用法,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。
三分钟你将学会:
MongoDB主要特征MongoDB优缺点,扬长避短何时选择MongoDB?为啥要用它?MongoDB与MySQL关键字对比下载与安装过程中一些常见的坑Java整合MongoDB,实现农民工增删改查 一、基本概念走起MongoDB是一款开源、跨平台、分布式,具有大数据处理能力的文档存储数据库。
文档数据库MongoDB用于记录文档结构的数据,比如JSON、XML结构的数据。
二、MongoDB的主要特征 高性能。提供JSON、XML等可嵌入数据快速处理功能,提供文档的索引功能,以提高查询速度;丰富的查询语言。为数据聚合、结构文档、地理空间提供丰富的查询功能;高可用性。提供自动故障转移和数据冗余处理功能;水平扩展能力。提供基于多服务器集群的分布式数据处理能力,具体处理时分主从和权衡(基于Hash自动推选)两种处理模式;支持多种存储引擎。MongoDB提供多种存储引擎,WiredTiger引擎、MMAPv1引擎是基于硬盘读写的存储引擎,In-Memory引擎是基于内存的存储引擎; 三、MongoDB优缺点,扬长避短 1、优点 Free-schema无模式文档,适应非结构化数据存储;内置GridFS,支持大容量的存储;内置Sharding,分片简单弱一致性(最终一致),更能保证用户的访问速度;查询性能优越,对于千万级别的文档对象,差不多10个G,对有索引的ID的查询不会比MySQL慢,而对非索引字段的查询,则是完胜MySQL;聚合框架,它支持典型几种聚合操作 , 比如,Aggregate pipelien, Map-Reduce等;支持自动故障恢复 2、缺点 太吃内存,快是有原因的,因为MongoDB把数据都放内存里了;对事务的支持不够友好;占用空间过大;对联表查询的支持不够强大;只有最终一致性,言外之意,就是可能造成数据的不一致,如果想要保持强一致性,必须在一个服务器处理所有的读写操作,坑;复杂聚合操作通过mapreduce创建,速度慢;Mongodb全局锁机制也是个坑;预分配模式会带来的磁盘瓶颈;删除记录时不会释放空间,相当于逻辑删除,这个真的坑;MongoDB到现在为止,好像还没有太好用的客户端工具; 四、何时选择MongoDB?为啥要用它? 1、MongoDB事务MongoDB目前只支持单文档事务,MongoDB暂时不适合需要复杂事务的场景。 灵活的文档模型JSON格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代,可用复制集满足数据高可靠、高可用的需求,运维较为简单、故障自动切换可扩展分片集群海量数据存储。
2、多引擎支持各种强大的索引需求 支持地理位置索引可用于构建各种O2O应用文本索引解决搜索的需求TTL索引解决历史数据过期的需求Gridfs解决文件存储的需求aggregation & mapreduce解决数据分析场景需求,可以自己写查询语句或脚本,将请求分发到 MongoDB 上完成。 3、具体的应用场景传统的关系型数据库在解决三高问题上的力不从心。 何为三高?
High performance - 对数据库高并发读写的需求。Huge Storage - 对海量数据的高效率存储和访问的需求。High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。MongoDB可以完美解决三高问题。
4、以下是几个实际的应用案例:(1)游戏场景
使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。
(2)物流场景
使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来,牛逼plus。
(3)社交场景
使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。
(4)物联网场景
使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。
(5)视频直播
使用MongoDB存储用户信息、点赞互动信息。
5、选择MongoDB的场景总结: 数据量大读写操作频繁数据价值较低,对事务要求不高 五、MongoDB与MySQL关键字对比 1、关键字对比 MySQLMongoDB解释说明databasedatabase数据库tablecollection表/集合rowdocument行/文档columnfield字段/域indexindex索引join嵌入文档表关联/MongoDB不支持join,MongoDB通过嵌入式文档来替代多表连接primary keyprimary key主键/MongoDB自动将_id字段设置为主键2、集合相当于MySQL中的表集合就是一组文档。可以看作是具有动态模式的表。
集合具有动态模式的特性。这意味着一个集合中的文档可以具有任意数量的不同形态。
但是,将不同类型的文档存放在一个集合中会出现很多问题:
文档中可以存放任意类型的变量,但是,这里不建议将不同类型的文档保存在同一个集合中,开发人员需要确保每个查询只返回特定模式的文档,或者确保执行查询的应用程序代码可以处理不同类型的文档;获取集合列表比提取集合中的文档类型列表要快得多,减少磁盘查找次数;相同类型的文档存放在同一个集合中可以实现数据的局部性,对于集合,让使用者见文知意;集合中只存放单一类型的文档,可以更高效地对集合进行索引; 3、集合的命名 集合名称中不能是空字符串;集合名称不能包含\0(空字符),因为这个字符用于表示一个集合名称的结束;集合名称不能以system.开头,该前缀是为内部集合保留的。集合名称不能有$,只能在某些特定情况下使用。通常情况下,可以认为这两个字符是MongoDB的保留字符,如果使用不当,那么驱动程序将无法正常工作。 4、文档相当于MySQL中的行文档是MongoDB中的基本数据单元,相当于传统关系型数据库中的行,它是一组有序键值的集合。每个文档都有一个特殊的键“_id”,其在所属的集合中是唯一的。
文档中的键是字符串类型。
键中不能含有\0(空字符)。这个字符用于表示一个键的结束。 .和$是特殊字符,只能在某些特定情况下使用。通常情况下,可以认为这两个字符是MongoDB的保留字符,如果使用不当,那么驱动程序将无法正常工作。
5、游标数据库会使用游标返回find的执行结果。游标的客户端实现通常能够在很大程度上对查询的最终输出进行控制。你可以限制结果的数量,跳过一些结果,按任意方向的任意键组合对结果进行排序,以及执行许多其他功能强大的操作。
通过cursor.hasNext()检查是否还有其它结果,通过cursor.next()用来对其进行获取。
调用find()时,shell并不会立即查询数据库,而是等到真正开始请求结果时才发送查询,这样可以在执行之前给查询附加额外的选项。cursor对象的大多数方法会返回游标本身,这样就可以按照任意顺序将选项